package com.yueqian.sc.dao.impl;

import com.yueqian.sc.bean.Users;
import com.yueqian.sc.dao.IUserDao;
import com.yueqian.sc.db.DBHelper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDao implements IUserDao {

    /**
     * 用户登录（管理员/教师/学生）
     *
     * @param user
     * @return 返回Users对象
     */
    @Override
    public Users login(Users user) {
        Connection conn = null;// 获取数据库连接
        PreparedStatement smt = null;// 对数据库进行增删改查操作
        ResultSet rs = null;// 接收数据库查询回来的数据
        Users users = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句,所有的静态参数使用?替代
            String sql = "select * from users where username = ? and password = ? and del_flag = 0";
            // 3. 获取预处理对象，如果获取到，才能操作数据库
            smt = conn.prepareStatement(sql);
            // 4. 使用外面传进来的数据替换掉? 问号和数据是一对一的
            smt.setString(1, user.getUsername());
            smt.setString(2, user.getPassword());
            // 5. 执行sql语句并返回查询结果
            rs = smt.executeQuery();
            // 6. 将查询回来的结果集中的数据取出来，放到user中
            if (rs != null && rs.next()) {// 如果有下一条数据，就访问
                users = new Users();
                // 从结果集取出数据放入实体类,绿色部分就是数据库表中对应的字段名
                users.setUserId(rs.getInt("user_id"));
                users.setUsername(rs.getString("username"));
                users.setPassword(rs.getString("password"));
                users.setNickname(rs.getString("nickname"));
                users.setGender(rs.getString("gender"));
                users.setPhone(rs.getString("phone"));
                users.setSpecialty(rs.getString("specialty"));
                users.setGrade(rs.getString("grade"));
                users.setRank(rs.getString("rank"));
                users.setPic(rs.getString("pic"));
                users.setRole(rs.getInt("role"));
                users.setDelFalg(rs.getInt("del_flag"));
                return users;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库连接
            DBHelper.close(rs, smt, conn);
        }
        return null;
    }

    /**
     * 根据最大用户编号获取用户的账号
     *
     * @param role
     * @return
     */
    @Override
    public String getUsernameByMaxId(Integer role) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;

        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql
            String sql = "select username from users where user_id = (select max(user_id) max_user_id from users where role=?)";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态数据替换掉占位符
            smt.setInt(1, role != null ? role : -1);
            // 5. 执行sql，返回结果集
            rs = smt.executeQuery();
            // 6. 解析结果集
            if(rs!=null && rs.next()){
                //return rs.getString("username");
                return rs.getString(1);// 获取索引上为1的数据
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(smt,conn);
        }
        return null;
    }

    /**
     * 修改密码
     *
     * @param userId      ：要修改密码的用户
     * @param newPassword ：要修改的新密码
     * @return
     */
    @Override
    public boolean updatePwd(int userId, String newPassword) {
        Connection conn = null;
        PreparedStatement smt = null;

        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写修改的sql
            String sql = "update users set password=? where user_id =?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            // 4. 使用外部动态的数据替换掉问号
            smt.setString(1, newPassword);
            smt.setInt(2, userId);
            // 5. 执行sql,返回受影响的行数
            int row = smt.executeUpdate();
            return row > 0 ? true : false;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6. 关闭数据库连接
            DBHelper.close(smt, conn);
        }
        return false;
    }

    /**
     * 获取旧密码是否存在
     *
     * @param userId
     * @param oldPwd
     * @return
     */
    @Override
    public boolean checkOldPwd(int userId, String oldPwd) {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet rs = null;
        try {
            // 1. 获取数据库连接
            conn = DBHelper.getConnection();
            // 2. 编写sql语句
            String sql = "select * from users where user_id = ? and password = ?";
            // 3. 创建预处理对象
            smt = conn.prepareStatement(sql);
            smt.setInt(1,userId);
            smt.setString(2,oldPwd);
            // 4. 执行sql，返回查询回来的结果集
            rs = smt.executeQuery();// 这个方法只针对查询
            // 5. 解析结果集
            if (rs != null && rs.next()) {
                return true;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 7. 关闭数据库
            DBHelper.close(rs, smt, conn);
        }
        return false;
    }


}














